/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.scp.dao.IDAOCotizacion;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.Cotizacion;

/**
 *
 * @author usuario
 */
@Repository("daoCotizacion")
public class DAOCotizacionImpl extends DaoImpl<Cotizacion, Integer> implements IDAOCotizacion, Serializable {

    private static Logger logger = Logger.getLogger(DAOCategoriaArticuloImpl.class);
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public Collection<Cotizacion> buscarCotizacionesPorFiltro1(Cotizacion cotizacion) throws DAOException {
        List<Cotizacion> listaCotizaciones = new ArrayList<Cotizacion>();
        try {
            System.out.println(cotizacion.getCodigo());
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .createAlias("idArticulo", "ar")
                    .createAlias("ar.idCategoriaArticulo", "ca")
                    .addOrder(Order.desc("id"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.like("codigo", "%" + cotizacion.getCodigo().trim() + "%"))
                    .add(Restrictions.like("cliente", "%" + cotizacion.getCliente().trim() + "%"))
                    .add(Restrictions.eq("idEmpresa", cotizacion.getIdEmpresa()));
            if (cotizacion.getIdArticulo().getIdCategoriaArticulo() != null) {
                listaCotizaciones = query
                        .add(Restrictions.disjunction()
                        .add(Restrictions.eq("ar.idCategoriaArticulo", cotizacion.getIdArticulo().getIdCategoriaArticulo()))
                        .add(Restrictions.eq("ca.idCategoriaArticulo", cotizacion.getIdArticulo().getIdCategoriaArticulo())))
                        .list();
            } else {
                listaCotizaciones = query.list();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaCotizaciones;
    }

    @Override
    public Collection<Cotizacion> buscarCotizacionesPorFiltro(Cotizacion cotizacion, Date fechaInicio, Date fechaFinal) throws DAOException {
        try {
            Collection<Cotizacion> lista = null;
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.like("codigo", "%" + cotizacion.getCodigo().trim() + "%"))
                    .add(Restrictions.like("nombreProducto", "%" + cotizacion.getNombreProducto().trim() + "%"))
                    .add(Restrictions.like("tipoCot", cotizacion.getTipoCot()))
                    .add(Restrictions.eq("idEmpresa", cotizacion.getIdEmpresa()));

            if (cotizacion.getCliente() != null) {
                //query = query.add(Restrictions.eq("idCliente", cotizacion.getIdCliente()));
                query = query.add(Restrictions.like("cliente", "%" + cotizacion.getCliente().trim() + "%"));
            }
            if (cotizacion.getVersion() == -1) {
                query = query.addOrder(Order.asc("cliente"));
                query = query.addOrder(Order.asc("fecCreacion"));
            } else {
                query = query.addOrder(Order.desc("id"));
            }

            if (fechaInicio == null && fechaFinal == null) {
                lista = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                lista = query.add(Restrictions.ge("fecCreacion", fechaInicio)).add(Restrictions.le("fecCreacion", fechaFinal)).list();
            } else if (fechaInicio == null) {
                lista = query.add(Restrictions.le("fecCreacion", fechaFinal)).list();
            } else if (fechaFinal == null) {
                lista = query.add(Restrictions.ge("fecCreacion", fechaInicio)).list();
            }

            return lista;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }

    @Override
    public Collection<Cotizacion> listarUltimasCotizacionesPorArticulo(Cotizacion cotizacion) throws DAOException {
        List<Cotizacion> listaCotizaciones = new ArrayList<Cotizacion>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaCotizaciones = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idArticulo", cotizacion.getIdArticulo()))
                    .add(Restrictions.eq("idEmpresa", cotizacion.getIdEmpresa()))
                    .list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaCotizaciones;
    }

    @Override
    public Collection<Cotizacion> buscarCotizacionesPorArticulo(Cotizacion cotizacion) throws DAOException {
        List<Cotizacion> listaCotizaciones = new ArrayList<Cotizacion>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaCotizaciones = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idArticulo", cotizacion.getIdArticulo()))
                    .add(Restrictions.eq("detalle", cotizacion.getDetalle()))
                    .add(Restrictions.eq("unidadMedida", cotizacion.getUnidadMedida()))
                    .add(Restrictions.eq("idEmpresa", cotizacion.getIdEmpresa()))
                    .list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaCotizaciones;
    }

    @Override
    public Collection<Cotizacion> listarVersionesPorCotizacion(Cotizacion cotizacion) throws DAOException {
        List<Cotizacion> listaCotizaciones = new ArrayList<Cotizacion>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaCotizaciones = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idArticulo", cotizacion.getIdArticulo()))
                    .add(Restrictions.eq("idEmpresa", cotizacion.getIdEmpresa()))
                    .add(Restrictions.eq("version", 1))
                    .list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaCotizaciones;
    }

    @Override
    public Cotizacion obtenerUltimaVersion(Cotizacion cotizacion) throws DAOException {
        List<Cotizacion> cotizacionBusqueda = new ArrayList<Cotizacion>();
        try {
            sessionFactory.getCurrentSession().flush();
            cotizacionBusqueda = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("codigo", cotizacion.getCodigo()))
                    .add(Restrictions.eq("tipoCot", cotizacion.getTipoCot()))
                    .add(Restrictions.eq("idEmpresa", cotizacion.getIdEmpresa()))
                    .addOrder(Order.desc("id"))
                    .list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }
        if (cotizacionBusqueda.size() > 0) {
            return cotizacionBusqueda.get(0);
        } else {
            return null;
        }
    }

    @Override
    public Collection<Articulo> listarArticulosCotizados(Articulo articulo, int idEmpresa) throws DAOException {
        List<Articulo> listaCotizaciones = new ArrayList<Articulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Cotizacion.class)
                    .createAlias("idArticulo", "ar")
                    .createAlias("ar.idCategoriaArticulo", "cat")
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idEmpresa.id", idEmpresa));
            if (articulo.getIdCategoriaArticulo() != null) {
                query = query.add(Restrictions.disjunction()
                        .add(Restrictions.eq("ar.idCategoriaArticulo", articulo.getIdCategoriaArticulo()))
                        .add(Restrictions.eq("cat.idCategoriaArticulo", articulo.getIdCategoriaArticulo())));
            }
            listaCotizaciones = query
                    .setProjection(Projections.distinct(Projections.property("idArticulo")))
                    .list();
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOException(e.getMessage(), e);
        }

        return listaCotizaciones;
    }
}
